# methods.py
from typing import List, Dict
from conversation_manager import APIClientManager

def entity_extraction_method(manager: APIClientManager, biography: str) -> List[Dict]:
    """
    实体提取法（4轮对话）
    :param manager: 对话管理器实例
    :param biography: 传记文本
    :return: 该方法对应的对话历史
    """
    method_history = []
    
    # 第一轮 - 简化提示词
    prompt1 = f"从以下传记中提取 {manager.enti_num} 个最重要的实体：\n传记：{biography}"
    print('prompt1:', prompt1)
    response1 = manager.generate_full_response(prompt1)
    print('response1:', response1)
    method_history.append({"prompt": prompt1, "response": response1})
    
    # 第二轮 - 简化提示
    prompt2 = f"基于提取的实体，将传记事实拆解为 {manager.enti_num} 个部分，每个部分格式: {{实体: 描述}}"
    response2 = manager.generate_full_response(prompt2, method_history)
    print('prompt2:', prompt2)
    print('response2:', response2)
    method_history.append({"prompt": prompt2, "response": response2})
    
    # 第三轮 - 简化核查提示
    prompt3 = f"核查每个实体以及实体所对应的事实描述的正确性，包括指出任何错误"
    response3 = manager.generate_full_response(prompt3, method_history)
    print('prompt3:', prompt3)
    print('response3:', response3)
    method_history.append({"prompt": prompt3, "response": response3})
    
    # 第四轮 - 最终生成
    prompt4 = "基于核查结果，重新生成准确的事实描述并撰写新传记"
    response4 = manager.generate_full_response(prompt4, method_history)
    print('prompt4:', prompt4)
    print('response4:', response4)
    method_history.append({"prompt": prompt4, "response": response4})

    return method_history

# 其他方法保持不变...
'''
'''


def one_reflection_method(manager: APIClientManager, biography: str) -> List[Dict]:
    """
    一次反思法（1轮对话）
    :param manager: 对话管理器实例
    :param biography: 传记文本
    :return: 该方法对应的对话历史
    """
    prompt = f"仔细检查传记中每个实体及事实描述的正确性，包括时间、地点及和其他实体间关系等各种细节，纠正错误后重新生成要点并撰写新传记。\n传记：{biography}"
    print('prompt:', prompt)
    response = manager.generate_full_response(prompt)
    print('response:', response)
    return[{"prompt": prompt, "response": response}]
  

def cot_method(manager: APIClientManager, subject: str, length: int = 100) -> List[Dict]:
    #这里少一个思维链方法
    """
    思维链法（1轮对话）
    :param manager: 对话管理器实例
    :param biography: 传记文本
    :return: 该方法对应的对话历史
    """
        # def generate_biography(self, subject: str, length: int = 100) -> str:

    prompt = f"请写一段关于{subject}的人物传记，约{length}字。要求内容准确、全面。\n Let’s think step by step."
    print('prompt:', prompt)
    response = manager.generate_full_response(prompt, max_tokens=500)
    print('response:', response)
    return[{"prompt": prompt, "response": response}]


'''
    prompt = f"仔细检查传记中每个实体及事实描述的正确性，包括时间、地点及实体间关系，纠正错误后重新生成要点并撰写新传记。\nLet’s think step by step."
    print('prompt:', prompt)
    response = manager.generate_full_response(prompt)
    print('response:', response)
    return [{"prompt": prompt, "response": response}]
'''

def atomic_method(manager: APIClientManager, biography: str) -> List[Dict]:
    """
    原子方法（2轮对话）
    :param manager: 对话管理器实例
    :param biography: 传记文本
    :return: 该方法对应的对话历史
    """
    method_history = []
    
    # 第一轮
    prompt1 = f"将以下传记内容拆解为独立且不可分割的原子事实：\n传记：{biography}"
    print('prompt1:', prompt1)
    response1 = manager.generate_full_response(prompt1)
    print('response1:', response1)
    method_history.append({"prompt": prompt1, "response": response1})
    
    # 第二轮
    prompt2 = f"检查每个原子事实的正确性，修改后生成新传记。再次检查每一个原子事实的正确性。\n原子事实列表：{response1}"
    response2 = manager.generate_full_response(prompt2, method_history)
    print('prompt2:', prompt2)
    print('response2:', response2)
    method_history.append({"prompt": prompt2, "response": response2})
    
    return method_history